指標可以進行許多運算,讓我們看看下面的例子:
#include<stdio.h>
int main(){
int *p;
int data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
p = &data[6];
printf("p存放的位址: %p\n\n", p);
printf("p存放的位址的值: %d\n\n", *p);
p ++;
printf("p存放的位址: %p\n\n", p);
printf("p存放的位址的值: %d\n\n", *p);
return 0;
}
輸出結果:
程式解說:
p
以及長度為 10 並已經存放數值的陣列data[6]
的位址放入指標變數 p
中(指標指向 data[6]
)p
裡面存放的位址(也就是data[6]
的位址)以及存放位址的值p
加一,代表位址移動了 4 bytes,因為我們宣告的是 int
p
裡面存放的位址(現在是data[7]
的位址)以及存放位址的值由以上例子也能驗證我們在陣列單元講到的-陣列使用連續記憶體位址!
如果有一行宣告程式碼長這樣:int *ptr[3];
因為 []
的優先順序大於 *
,表示這個陣列元素(有三個),都指向某個特定的資料型態(int
),我們稱他為指標陣列。
來看一段程式碼:
#include<stdio.h>
int main(){
int data[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
int *p[3] = {data[0], data[1], data[2]};
printf("%d %d %d ", **p, **(p+1), **(p+2));
return 0;
}
以下是輸出結果:
程式說明:
data
,其大小是 3*4,並宣告一個指標陣列,指向 data
每一列開頭。我們可以看到,把陣列指標 p
印出後,會發現裡面放的位址指向的值,是二維陣列每一列開頭!
畫成圖會長這樣:
以前老師上課時有跟我們說:在陣列與指標這裡,*
和 []
在某種意義上是可以當成一樣的意思。
例如:在上面的程式碼中,**p
換成 *p[0]
是一樣的。
指標的基本概念大致上講到這邊,明天,我們來看一個有一點點小困難的例子,希望透過那個例子,可以讓我們更了解指標!